package cn.iocoder.yudao.module.trade.service.order.handler;

import cn.iocoder.yudao.framework.common.enums.trade.TransactionTypeEnum;
import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil;
import cn.iocoder.yudao.module.member.api.config.dto.MemberConfMaterialDTO;
import cn.iocoder.yudao.module.member.api.config.dto.MemberConfRespDTO;
import cn.iocoder.yudao.module.pay.api.order.dto.PayOrderCreateReqDTO;
import cn.iocoder.yudao.module.pay.enums.notify.PayNotifyTypeEnum;
import cn.iocoder.yudao.module.trade.controller.app.order.vo.AppTradeOrderOrderReqVO;
import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO;
import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateReqBO;
import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateRespBO;
import org.springframework.stereotype.Component;

import java.math.BigDecimal;

import static cn.iocoder.yudao.module.trade.enums.ErrorCodeConstants.ORDER_CREATE_FAIL_USER_NO_PERMISSION;

/**
 * 存料交易模式处理器
 */
@Component
public class StoreMaterialTransactionHandler extends AbstractTransactionModeHandler {

    private static final TransactionTypeEnum TRANSACTION_TYPE = TransactionTypeEnum.STORE_METAL;

    @Override
    public Integer getTransactionType() {
        return TRANSACTION_TYPE.getType();
    }

    @Override
    public void validatePermission(MemberConfRespDTO memberConf) {
        if (Boolean.FALSE.equals(memberConf.getFullPayBuy())) {
            throw ServiceExceptionUtil.exception(ORDER_CREATE_FAIL_USER_NO_PERMISSION, TRANSACTION_TYPE.getDesc());
        }
    }
    
    @Override
    public void validateTradeLimits(MemberConfMaterialDTO materialConf, AppTradeOrderOrderReqVO settlementReqVO) {
        // 调用父类的通用限制校验
        super.validateTradeLimits(materialConf, settlementReqVO);
        
        // 存料特有限制校验
        // 例如可能需要验证用户已有存料总量是否超过上限
//        if (materialConf.getMaxStorageWeight() != null) {
//            // 获取用户当前已存总量 + 本次存料量 与上限比较
//            // TODO: 实现获取用户当前已存总量的逻辑
//            BigDecimal currentStoredWeight = getCurrentStoredWeight(settlementReqVO.getUserId(), materialConf.getMetalType());
//            if (currentStoredWeight != null &&
//                currentStoredWeight.add(settlementReqVO.getWeight()).compareTo(materialConf.getMaxStorageWeight()) > 0) {
//                throw ServiceExceptionUtil.exception(ORDER_CREATE_FAIL_EXCEED_MAX_STORAGE_WEIGHT);
//            }
//        }
    }

    @Override
    protected void setPriceResult(TradePriceCalculateReqBO calculateReqBO, TradePriceCalculateRespBO result, TradePriceCalculateRespBO context) {
        if (context.getDeposit().compareTo(BigDecimal.ZERO) > 0) {
            result.setPayType(PayNotifyTypeEnum.ORDER_DEPOSIT.getType());
        } else {
            result.setPayType(PayNotifyTypeEnum.ORDER.getType());
        }
    }

    @Override
    protected BigDecimal calculatePayPrice(TradePriceCalculateReqBO calculateReqBO, TradePriceCalculateRespBO calContext) {
        return BigDecimal.ZERO;
    }


    @Override
    public PayOrderCreateReqDTO creatSettlePay(TradeOrderDO order, Boolean isViolate) {
        return null;
    }

    /**
     * 获取用户当前已存储的重量
     * 
     * @param userId 用户ID
     * @param metalType 金属类型
     * @return 已存储重量
     */
    private BigDecimal getCurrentStoredWeight(Long userId, Integer metalType) {
        // TODO: 实现从存储服务或数据库获取用户已存量的逻辑
        return null; // 暂时返回null，实际应用中需要实现
    }

} 